﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLFuncionario : BLBase
    {

        // Representa o objeto de acesso a dados
        private DAFuncionario da = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLFuncionario()
            : base("DEFAULT")
        {
            da = new DAFuncionario("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLFuncionario(string tenantId)
            :base(tenantId)
        {
            da = new DAFuncionario(tenantId);
        }

        /// <summary>
        /// Consulta funcionários (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdEmpresa">Código da empresa</param>
        /// <param name="nmFuncionario">Nome do funcionário</param>
        /// <param name="nrCPF">CPF do funcionário</param>
        /// <param name="vlSalario">Valor do salário</param>
        /// <param name="inTipo">Tipo do funcionário (N-Normal / F-Ferista)</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de funcionários</returns>
        public List<FUNCIONARIO> consultarFuncionarios(int cdEmpresa, string nmFuncionario, string nrCPF, 
            decimal? vlSalario, string inTipo, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<FUNCIONARIO> retorno = null;

            try
            {
                retorno = this.da.consultarFuncionarios(cdEmpresa, nmFuncionario, nrCPF, vlSalario,
                    inTipo, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta funcionários (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdEmpresa">Código da empresa</param>
        /// <param name="nmFuncionario">Nome do funcionário</param>
        /// <param name="nrCPF">CPF do funcionário</param>
        /// <param name="vlSalario">Valor do salário</param>
        /// <param name="inTipo">Tipo do funcionário (N-Normal / F-Ferista)</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarFuncionariosCount(short cdEmpresa, string nmFuncionario, string nrCPF, decimal? vlSalario, string inTipo)
        {
            int retorno = 0;

            try
            {
                retorno = da.consultarFuncionariosCount(cdEmpresa, nmFuncionario, nrCPF, vlSalario, inTipo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta funcionários (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdContrato">Contrato da ocupação do funcionário, quando houver</param>
        /// <param name="nrCPF">CPF do funcionário</param>
        /// <param name="nmFuncionario">Nome do funcionário</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de funcionários</returns>
        public List<FUNCIONARIO> consultarFuncionarios(int cdContrato, string nrCpf, string nmFuncionario, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<FUNCIONARIO> retorno = null;

            try
            {
                retorno = this.da.consultarFuncionarios(cdContrato, nrCpf, nmFuncionario, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta funcionários (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdContrato">Contrato da ocupação do funcionário, quando houver</param>
        /// <param name="nrCPF">CPF do funcionário</param>
        /// <param name="nmFuncionario">Nome do funcionário</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarFuncionariosCount(int cdContrato, string nrCpf, string nmFuncionario)
        {
            int retorno = 0;

            try
            {
                retorno = this.da.consultarFuncionariosCount(cdContrato, nrCpf, nmFuncionario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um funcionário
        /// </summary>
        /// <param name="cdFuncionario">Código do funcionário</param>
        /// <returns>Entidade funcionário</returns>
        public FUNCIONARIO obterFuncionario(int cdFuncionario)
        {
            FUNCIONARIO retorno = null;

            try
            {
                retorno = da.obterFuncionario(cdFuncionario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um funcionário
        /// </summary>
        /// <param name="nrCpf">CPF do funcionário</param>
        /// <returns>Entidade funcionário</returns>
        public FUNCIONARIO obterFuncionario(string nrCpf)
        {
            FUNCIONARIO retorno = null;

            try
            {
                retorno = da.obterFuncionario(nrCpf);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um funcionário
        /// </summary>
        /// <param name="cdFuncionario">Código do funcionário</param>
        /// <returns>Lista contendo um funcionário</returns>
        public List<FUNCIONARIO> listarFuncionario(int cdFuncionario)
        {
            List<FUNCIONARIO> retorno = null;

            try
            {
                retorno = this.da.listarFuncionario(cdFuncionario);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Listar funcionários de um contrato para combo
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <returns>Lista contendo entidade para combo</returns>
        public List<TOCombo> listarFuncionariosContratoCombo(int cdContrato)
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarFuncionariosContratoCombo(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista os funcionários de uma empresa que não estão ocupados em um contrato, para exibição em combo
        /// </summary>
        /// <param name="cdEmpresa">Código da empresa</param>
        /// <returns>Lista contendo entidade para combo</returns>
        public List<TOCombo> listarFuncionariosPorEmpresaCombo(int cdEmpresa)
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarFuncionariosPorEmpresaCombo(cdEmpresa);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }


        #region Métodos básicos - CRUD

        /// <summary>
        /// Insere um funcionário
        /// </summary>
        /// <param name="entity">Entidade funcionário</param>
        /// <returns>Código do funcionário</returns>
        public int inserirFuncionario(FUNCIONARIO entity)
        {
            int retorno = 0;

            try
            {
                retorno = this.da.inserirFuncionario(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de um funcionário
        /// </summary>
        /// <param name="entity">Entidade funcionário</param>
        public void atualizarFuncionario(FUNCIONARIO entity)
        {
            try
            {
                this.da.atualizarFuncionario(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui um funcionário
        /// </summary>
        /// <param name="entity">Entidade funcionário</param>
        public void excluirFuncionario(FUNCIONARIO entity)
        {
            try
            {
                this.da.excluirFuncionario(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion
    }

}
